﻿// CElementListView.cpp: 实现文件
//

#include "stdafx.h"
#include "zChecker.h"
#include "ElementListView.h"


// CElementListView

IMPLEMENT_DYNCREATE(CElementListView, CListView)

CElementListView::CElementListView()
{

}

CElementListView::~CElementListView()
{
}

BEGIN_MESSAGE_MAP(CElementListView, CListView)
	ON_WM_CREATE()
	ON_WM_SIZE()
	ON_NOTIFY_REFLECT(NM_CLICK, &CElementListView::OnNMClick)
	ON_NOTIFY_REFLECT(NM_DBLCLK, &CElementListView::OnNMDbClick)
	ON_NOTIFY_REFLECT(NM_RCLICK, &CElementListView::OnNMRClick)
	ON_NOTIFY_REFLECT(LVN_COLUMNCLICK, &CElementListView::OnColumnclick)
	
END_MESSAGE_MAP()


// CElementListView 诊断

#ifdef _DEBUG
void CElementListView::AssertValid() const
{
	CListView::AssertValid();
}

#ifndef _WIN32_WCE
void CElementListView::Dump(CDumpContext& dc) const
{
	CListView::Dump(dc);
}
#endif
#endif //_DEBUG


// CElementListView 消息处理程序


int CElementListView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
	if (CListView::OnCreate(lpCreateStruct) == -1)
		return -1;

	// TODO:  在此添加您专用的创建代码
	CListCtrl& list = GetListCtrl();

	list.ModifyStyle(0, LVS_REPORT | LVS_SINGLESEL );
	list.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES | LVS_EX_AUTOSIZECOLUMNS);

	list.InsertColumn(0, "名称", LVCFMT_LEFT, 150);
	list.InsertColumn(1, "编码", LVCFMT_LEFT, 150);
	list.InsertColumn(2, "类别", LVCFMT_LEFT, 150);
	list.InsertColumn(3, "描述", LVCFMT_LEFT, 150);

	Init();

	return 0;
}


void CElementListView::OnSize(UINT nType, int cx, int cy)
{
	CListView::OnSize(nType, cx, cy);

	// TODO: 在此处添加消息处理程序代码
}


BOOL CElementListView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: 在此添加专用代码和/或调用基类

	return CListView::PreCreateWindow(cs);
}

void CElementListView::Init()
{
	int nItem = 0;
	CListCtrl& list = GetListCtrl();
	nItem = list.InsertItem(list.GetItemCount(), "空间参考系");
	list.SetItemText(nItem, 1, "001-000-000");

	list.InsertItem(list.GetItemCount(), "位置精度");
	list.SetItemText(nItem, 1, "002-000-000");

	list.InsertItem(list.GetItemCount(), "属性精度");
	list.SetItemText(nItem, 1, "003-000-000");
}

/************************************************************************/
/* 左键点击事件                                                          */
/************************************************************************/
void CElementListView::OnNMClick(NMHDR* pNMHDR, LRESULT* pResult)
{
	CListCtrl &list = GetListCtrl();
	NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
	int nItem = pNMListView->iItem;
	int nSubItem = pNMListView->iSubItem;

	CString strText = list.GetItemText(nItem, nSubItem);
	AfxMessageBox(strText);

}

/************************************************************************/
/* 左键双击事件                                                          */
/************************************************************************/
void CElementListView::OnNMDbClick(NMHDR* pNMHDR, LRESULT* pResult)
{
	CListCtrl &list = GetListCtrl();
	NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
	int nItem = pNMListView->iItem;
	int nSubItem = pNMListView->iSubItem;

	CString strText = list.GetItemText(nItem, nSubItem);
	AfxMessageBox(strText);

}

/************************************************************************/
/* 右键点击事件                                                          */
/************************************************************************/
void CElementListView::OnNMRClick(NMHDR* pNMHDR, LRESULT* pResult)
{
	CListCtrl &list = GetListCtrl();
	NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
	int nItem = pNMListView->iItem;
	int nSubItem = pNMListView->iSubItem;

	CString strText = list.GetItemText(nItem, nSubItem);
	AfxMessageBox(strText);

}

/************************************************************************/
/* 点击ColumnHead事件                                                          */
/************************************************************************/
void CElementListView::OnColumnclick(NMHDR* pNMHDR, LRESULT* pResult)
{
	AfxMessageBox("Click Column");
	
	//164     static int ncurSortCol = -1; // 保存当前的排序列。
	//165     // 一开始表示为-1，表示尚未按任何列排序。
	//	166     NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
	//167     CListCtrl* lc = &GetListCtrl();
	//168     LONG ws = GetWindowLong(lc->m_hWnd, GWL_STYLE);
	//169     int nSortOrder; // 排序的方式
	//170
	//	171     // 若点击列与当前排序列不同的列，则改变排序序，并将排序方式改为增序。
	//	172     // 若当前排序列与点击列相同，则更改增、减序的排序方式
	//	173     if (ncurSortCol == pNMListView->iSubItem)
	//	174     {
	//	175         if (ws & LVS_SORTASCENDING)
	//		176         {
	//		177             ws ^= LVS_SORTASCENDING;
	//		178             nSortOrder = LVS_SORTDESCENDING;
	//		179         }
	//	180         else
	//		181         {
	//		182             ws ^= LVS_SORTDESCENDING;
	//		183             nSortOrder = LVS_SORTASCENDING;
	//		184         }
	//	185     }
	//186     else
	//	187     {
	//	188         if (ws & LVS_SORTASCENDING)
	//		189         {
	//		190             nSortOrder = LVS_SORTDESCENDING;
	//		191             ncurSortCol = pNMListView->iSubItem;
	//		192         }
	//	193         else
	//		194         {
	//		195             nSortOrder = LVS_SORTASCENDING;
	//		196             ncurSortCol = pNMListView->iSubItem;
	//		197         }
	//	198     }
	//199
	//	200     // 将当前的排序信息保存在窗口Style中，供以后使用
	//	201     ws |= nSortOrder;
	//202     SetWindowLong(lc->m_hWnd, GWL_STYLE, ws);
	//203
	//	204     // 将各ITEM的LPARAM用新排序列的内容替换
	//	205     LVITEM li;
	//206     li.mask = LVIF_PARAM | LVIF_TEXT;
	//207     TCHAR szItemText[1024];
	//208     for (int i = 0; i < lc->GetItemCount(); i++)
	//	209     {
	//	210         li.iItem = i;
	//	211         li.iSubItem = ncurSortCol;
	//	212         li.cchTextMax = 1024;
	//	213         li.pszText = szItemText;
	//	214         lc->GetItem(&li);
	//	215         TCHAR * szlparam = (TCHAR *)li.lParam;
	//	216         // 删除以前的信息，释放空间
	//		217         // 添加List Item时应注意将lParam初始化NULL
	//		218         if (szlparam != NULL)
	//		219             delete szlparam;
	//	220
	//		221         // 复制当前列的szItemText到Item的lParam中
	//		222         szlparam = new TCHAR[lstrlen(szItemText) + 1];
	//	223         lstrcpy(szlparam, szItemText);
	//	224             lc->SetItemData(i, DWORD(szlparam));
	//	225     }
	//226
	//	227     // 开始排序
	//	228     if (ncurSortCol == 0)//第一列按整数排序
	//	229     {
	//	230         GetListCtrl().SortItems(ListViewCompareIntFunc, (LPARAM)(&nSortOrder));
	//	231     }
	//232     else
	//	233         GetListCtrl().SortItems(ListViewCompareFunc, (LPARAM)(&nSortOrder));
	//234 * pResult = 0;
	//235
}

void CElementListView::Populate(unsigned int ckCode, CString strText)
{
	CListCtrl& list = GetListCtrl();

	list.DeleteAllItems();
	//list.InsertItem(list.GetItemCount(), strText);

	ck::CheckElement* pElement = NULL;
	ck::EnumCheckElement* pElements = NULL;
	ck::ElementRepository* pElemManager = ck::ElementRepository::GetInstance();
	pElements = pElemManager->GetChildElements(ckCode);
	pElements->Reset();
	while ((pElement = pElements->Next()))
	{
		AddCheckElement(pElement);
	}

	pElements->Release();
}

void CElementListView::AddCheckElement(ck::CheckElement* pElement)
{
	CListCtrl& list = GetListCtrl();

	int nItem = 0;
	nItem = list.InsertItem(list.GetItemCount(), pElement->GetName());
	list.SetItemText(nItem, 1, pElement->GetCodeString());
	//list.SetItemText(nItem, 2, "类别");
	list.SetItemText(nItem, 3, pElement->GetDescription());
}